iBATIS (MyBatis), যা বর্তমানে MyBatis নামে পরিচিত, একটি SQL ম্যাপিং ফ্রেমওয়ার্ক যা SQL কুয়েরি এবং Java objects-এর মধ্যে সম্পর্ক স্থাপন করে। Eager Loading হল একটি ORM (Object-Relational Mapping) কৌশল, যেখানে সম্পর্কিত ডেটা (যেমন ফোরেন কীগুলির মাধ্যমে সম্পর্কিত অবজেক্ট) লোড করা হয় ডেটাবেস থেকে যখন মূল অবজেক্টটি লোড করা হয়। iBATIS/MyBatis-এ Eager Loading সাধারণত join বা fetch কৌশল ব্যবহার করে হয়, যা সম্পর্কিত ডেটা একসাথে লোড করে।
iBATIS (MyBatis)-এ Eager Loading কৌশলের ব্যবহার এবং সেটআপ সম্পর্কে এখানে বিস্তারিত আলোচনা করা হবে।
1. What is Eager Loading?
Eager Loading হল একটি কৌশল যেখানে যখন একটি অবজেক্ট লোড করা হয়, তখন তার সম্পর্কিত অবজেক্টগুলো (যেমন One-to-Many, Many-to-One, বা Many-to-Many) একই সাথে ডেটাবেস থেকে লোড করা হয়। অর্থাৎ, Lazy Loading-এর বিপরীতে, যেখানে সম্পর্কিত অবজেক্টগুলো শুধুমাত্র প্রয়োজন হলে লোড হয়, Eager Loading সম্পর্কিত সমস্ত ডেটা একসাথে লোড করে।
Eager Loading এর সুবিধা:
- একাধিক সম্পর্কিত অবজেক্টের ডেটা একসাথে লোড করা হয়, ফলে পরবর্তীতে ওই অবজেক্টগুলো রিট্রিভ করতে অতিরিক্ত SQL কোয়েরি চালাতে হয় না।
- যখন আপনি জানেন যে, সম্পর্কিত ডেটাগুলির প্রয়োজন হবে, তখন এটি পারফরম্যান্সের জন্য কার্যকর হতে পারে।
Eager Loading এর অসুবিধা:
- যদি সম্পর্কিত ডেটা অনেক বড় বা জটিল হয়, তবে একসাথে সব কিছু লোড করলে performance bottlenecks হতে পারে।
- অতিরিক্ত ডেটা লোড হওয়া উক্ত কেসে memory ব্যবহার বাড়িয়ে দিতে পারে।
2. iBATIS (MyBatis) Eager Loading Implementation
iBATIS (MyBatis)-এ Eager Loading অর্জন করতে সাধারণত join কুয়েরি ব্যবহার করা হয়, যেখানে সম্পর্কিত টেবিলগুলির ডেটা একসাথে লোড করা হয়।
a) One-to-Many Relationship Eager Loading
ধরা যাক, আমাদের একটি Student ক্লাস রয়েছে, এবং সেই Student ক্লাসের সাথে সম্পর্কিত একাধিক Course অবজেক্টের তথ্য রিট্রিভ করতে হবে। এই ধরনের সম্পর্কের জন্য Eager Loading ব্যবহার করতে পারেন।
Example: SQL Query for One-to-Many Relationship
<select id="getStudentWithCourses" resultMap="studentWithCoursesMap">
SELECT s.id AS student_id, s.name AS student_name, c.id AS course_id, c.name AS course_name
FROM student s
LEFT JOIN course c ON s.id = c.student_id
WHERE s.id = #{id}
</select>
<resultMap id="studentWithCoursesMap" type="com.example.Student">
<id property="id" column="student_id"/>
<result property="name" column="student_name"/>
<collection property="courses" ofType="com.example.Course">
<id property="id" column="course_id"/>
<result property="name" column="course_name"/>
</collection>
</resultMap>
Explanation:
LEFT JOIN:studentটেবিলের সাথেcourseটেবিলের ডেটা যোগ করা হচ্ছেstudent_idএর মাধ্যমে।<collection>: এটিstudentএর সাথে সম্পর্কিত সমস্তcourseঅবজেক্ট লোড করে। এটি Eager Loading এর উদাহরণ, যেখানে একসাথে ছাত্র এবং তার কোর্সের সব তথ্য রিট্রিভ করা হচ্ছে।
b) Many-to-One Relationship Eager Loading
একটি Course অবজেক্টের সাথে সম্পর্কিত Instructor অবজেক্টের তথ্য লোড করার জন্য Many-to-One সম্পর্কের জন্য Eager Loading ব্যবহার করতে হবে।
Example: SQL Query for Many-to-One Relationship
<select id="getCourseWithInstructor" resultType="com.example.Course">
SELECT c.id AS course_id, c.name AS course_name, i.id AS instructor_id, i.name AS instructor_name
FROM course c
LEFT JOIN instructor i ON c.instructor_id = i.id
WHERE c.id = #{id}
</select>
Explanation:
LEFT JOIN:courseটেবিলের সাথেinstructorটেবিলের ডেটা যোগ করা হচ্ছেinstructor_idএর মাধ্যমে।LEFT JOINব্যবহারের মাধ্যমে Eager Loading নিশ্চিত করা হচ্ছে, যাcourseএবং তার সম্পর্কিত instructor এর তথ্য একসাথে লোড করে।
3. Using @FetchType.EAGER Annotation in JPA (When using JPA with iBATIS)
যদি আপনি iBATIS এর সাথে JPA ব্যবহার করছেন, তবে আপনি FetchType.EAGER অ্যানোটেশন ব্যবহার করতে পারেন। এটি Eager Loading নির্ধারণ করতে সাহায্য করে।
Example: Using @ManyToOne with FetchType.EAGER
@Entity
public class Course {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "instructor_id")
private Instructor instructor;
// Getters and Setters
}
Explanation:
@ManyToOne(fetch = FetchType.EAGER): এটি নির্দেশ করে যে,Courseঅবজেক্টের সাথে সম্পর্কিতInstructorঅবজেক্টকে Eagerly লোড করতে হবে, অর্থাৎCourseঅবজেক্ট লোড করার সময় তার সম্পর্কিতInstructorঅবজেক্টও একসাথে লোড হবে।
4. Eager Loading in iBATIS Using ResultMaps
iBATIS (MyBatis)-এ ResultMap ব্যবহার করে সম্পর্কিত অবজেক্টগুলির Eager Loading করা যায়। আপনি <resultMap> ব্যবহার করে সম্পর্কিত টেবিলের ডেটা ম্যাপ করতে পারেন এবং একটি সম্পর্কিত Java object (বা collection) রিটার্ন করতে পারেন।
Example: Eager Loading with ResultMap
<resultMap id="studentMap" type="com.example.Student">
<id property="id" column="student_id"/>
<result property="name" column="student_name"/>
<collection property="courses" ofType="com.example.Course">
<id property="id" column="course_id"/>
<result property="name" column="course_name"/>
</collection>
</resultMap>
<select id="getStudentWithCourses" resultMap="studentMap">
SELECT s.id AS student_id, s.name AS student_name, c.id AS course_id, c.name AS course_name
FROM student s
LEFT JOIN course c ON s.id = c.student_id
WHERE s.id = #{id}
</select>
Explanation:
<collection>: এটি student অবজেক্টের সাথে সম্পর্কিত course অবজেক্টের একটি সংগ্রহকে লোড করবে। এটি Eager Loading ব্যবহার করে।
5. Advantages and Disadvantages of Eager Loading
Advantages:
- Fewer Database Queries: সম্পর্কিত ডেটা একসাথে লোড করা হয়, ফলে পরবর্তীতে আলাদা আলাদা কোয়েরি পাঠানোর প্রয়োজন হয় না।
- Performance Boost: যদি সম্পর্কিত ডেটা ব্যবহার করা হয়, তাহলে একসাথে লোড করার ফলে network latency কমে যায় এবং পারফরম্যান্স বাড়ে।
Disadvantages:
- Memory Usage: অতিরিক্ত ডেটা একসাথে লোড করার কারণে memory ব্যবহারে বৃদ্ধি হতে পারে।
- Complexity in Handling Large Data Sets: যদি সম্পর্কিত ডেটা খুব বড় হয়, তবে একসাথে সব কিছু লোড করলে পারফরম্যান্স সমস্যা তৈরি হতে পারে।
Eager Loading iBATIS (MyBatis)-এ সম্পর্কিত টেবিলের ডেটা একসাথে লোড করার একটি কৌশল যা বিশেষ করে One-to-Many এবং Many-to-One সম্পর্কের ক্ষেত্রে উপকারী। JOIN এবং ResultMap ব্যবহার করে আপনি সহজেই Eager Loading বাস্তবায়ন করতে পারেন। যদিও Eager Loading অনেক ক্ষেত্রে পারফরম্যান্সের জন্য উপকারী, তবে যখন সম্পর্কিত ডেটার পরিমাণ অনেক বেশি হয়, তখন এটি মেমরি সমস্যা সৃষ্টি করতে পারে, সেক্ষেত্রে Lazy Loading ব্যবহার করা হতে পারে বেশি কার্যকর।
Read more